package com.cardcaptorsakura.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 语音合成响应DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VoiceSynthesisResponse {

    /**
     * 音频文件路径
     */
    private String audioPath;

    /**
     * 音频文件URL
     */
    private String audioUrl;

    /**
     * 使用的声音
     */
    private String voice;

    /**
     * 音频格式
     */
    private String format;

    /**
     * 语音速度
     */
    private Double speed;

    /**
     * 音调
     */
    private Double pitch;

    /**
     * 音量
     */
    private Double volume;

    /**
     * 音频时长（秒）
     */
    private Double duration;

    /**
     * 文件大小（字节）
     */
    private Long fileSize;

    /**
     * 采样率
     */
    private Integer sampleRate;

    /**
     * 比特率
     */
    private Integer bitRate;

    /**
     * 声道数
     */
    private Integer channels;

    /**
     * 合成的文本
     */
    private String text;

    /**
     * 原始文本
     */
    private String originalText;

    /**
     * 使用的语言
     */
    private String language;

    /**
     * 情感类型
     */
    private String emotion;

    /**
     * 情感强度
     */
    private Double emotionIntensity;

    /**
     * 合成时间
     */
    private LocalDateTime synthesizedAt;

    /**
     * 处理耗时（毫秒）
     */
    private Long processingTime;

    /**
     * 合成状态
     */
    @Builder.Default
    private SynthesisStatus status = SynthesisStatus.SUCCESS;

    /**
     * 错误信息（如果合成失败）
     */
    private String errorMessage;

    /**
     * 音频质量评分
     */
    private Double qualityScore;

    /**
     * 是否包含背景音乐
     */
    private Boolean hasBackgroundMusic;

    /**
     * 背景音乐类型
     */
    private String backgroundMusicType;

    /**
     * 音频波形数据（用于可视化）
     */
    private List<Double> waveformData;

    /**
     * 音频频谱数据
     */
    private List<Double> spectrumData;

    /**
     * 音频特征
     */
    private AudioFeatures audioFeatures;

    /**
     * 内容安全检查结果
     */
    private ContentSafetyResult safetyResult;

    /**
     * 元数据
     */
    private java.util.Map<String, Object> metadata;

    /**
     * 任务ID（异步处理时使用）
     */
    private String taskId;

    /**
     * 合成状态枚举
     */
    public enum SynthesisStatus {
        SUCCESS,    // 成功
        FAILED,     // 失败
        PENDING,    // 处理中
        CANCELLED,  // 已取消
        TIMEOUT     // 超时
    }

    /**
     * 音频特征
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class AudioFeatures {
        /**
         * 平均音量
         */
        private Double averageVolume;

        /**
         * 峰值音量
         */
        private Double peakVolume;

        /**
         * 动态范围
         */
        private Double dynamicRange;

        /**
         * 基频（Hz）
         */
        private Double fundamentalFrequency;

        /**
         * 语音清晰度评分
         */
        private Double clarityScore;

        /**
         * 自然度评分
         */
        private Double naturalnessScore;

        /**
         * 情感表达度评分
         */
        private Double emotionalExpressiveness;

        /**
         * 语音停顿信息
         */
        private List<PauseInfo> pauses;
    }

    /**
     * 停顿信息
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class PauseInfo {
        /**
         * 停顿开始时间（秒）
         */
        private Double startTime;

        /**
         * 停顿持续时间（秒）
         */
        private Double duration;

        /**
         * 停顿类型
         */
        private String type; // SENTENCE, PARAGRAPH, BREATH
    }

    /**
     * 内容安全检查结果
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ContentSafetyResult {
        /**
         * 是否安全
         */
        private Boolean isSafe;

        /**
         * 风险等级
         */
        private String riskLevel;

        /**
         * 检测到的问题类型
         */
        private List<String> detectedIssues;

        /**
         * 置信度分数
         */
        private Double confidenceScore;

        /**
         * 详细说明
         */
        private String description;
    }

    /**
     * 获取下载URL
     */
    public String getDownloadUrl() {
        if (audioPath != null) {
            String[] pathParts = audioPath.split("/");
            if (pathParts.length >= 3) {
                String userId = pathParts[pathParts.length - 2];
                String filename = pathParts[pathParts.length - 1];
                return "/api/output/voice/download/" + userId + "/" + filename;
            }
        }
        return audioUrl;
    }

    /**
     * 检查是否合成成功
     */
    public boolean isSuccess() {
        return status == SynthesisStatus.SUCCESS;
    }

    /**
     * 检查是否正在处理
     */
    public boolean isPending() {
        return status == SynthesisStatus.PENDING;
    }

    /**
     * 获取文件扩展名
     */
    public String getFileExtension() {
        if (audioPath != null) {
            int lastDotIndex = audioPath.lastIndexOf('.');
            if (lastDotIndex > 0) {
                return audioPath.substring(lastDotIndex + 1).toLowerCase();
            }
        }
        return format != null ? format.toLowerCase() : "mp3";
    }

    /**
     * 获取人类可读的文件大小
     */
    public String getHumanReadableFileSize() {
        if (fileSize == null) {
            return "未知";
        }
        
        if (fileSize < 1024) {
            return fileSize + " B";
        } else if (fileSize < 1024 * 1024) {
            return String.format("%.1f KB", fileSize / 1024.0);
        } else {
            return String.format("%.1f MB", fileSize / (1024.0 * 1024.0));
        }
    }

    /**
     * 获取人类可读的音频时长
     */
    public String getHumanReadableDuration() {
        if (duration == null) {
            return "未知";
        }
        
        int totalSeconds = (int) Math.round(duration);
        int minutes = totalSeconds / 60;
        int seconds = totalSeconds % 60;
        
        if (minutes > 0) {
            return String.format("%d:%02d", minutes, seconds);
        } else {
            return String.format("%d秒", seconds);
        }
    }

    /**
     * 获取人类可读的处理时间
     */
    public String getHumanReadableProcessingTime() {
        if (processingTime == null) {
            return "未知";
        }
        
        if (processingTime < 1000) {
            return processingTime + " ms";
        } else {
            return String.format("%.1f s", processingTime / 1000.0);
        }
    }

    /**
     * 获取音频质量描述
     */
    public String getQualityDescription() {
        if (qualityScore == null) {
            return "未评估";
        }
        
        if (qualityScore >= 0.9) {
            return "优秀";
        } else if (qualityScore >= 0.8) {
            return "良好";
        } else if (qualityScore >= 0.7) {
            return "一般";
        } else if (qualityScore >= 0.6) {
            return "较差";
        } else {
            return "很差";
        }
    }

    /**
     * 获取比特率描述
     */
    public String getBitRateDescription() {
        if (bitRate == null) {
            return "未知";
        }
        
        return bitRate + " kbps";
    }

    /**
     * 获取采样率描述
     */
    public String getSampleRateDescription() {
        if (sampleRate == null) {
            return "未知";
        }
        
        if (sampleRate >= 44100) {
            return sampleRate / 1000.0 + " kHz (高质量)";
        } else if (sampleRate >= 22050) {
            return sampleRate / 1000.0 + " kHz (标准质量)";
        } else {
            return sampleRate / 1000.0 + " kHz (低质量)";
        }
    }
}